package spbun.fileclean;

import java.io.File;

import javax.sql.DataSource;

import org.apache.log4j.Logger;
import org.h2.jdbcx.JdbcDataSource;

import spbun.fileclean.common.FileUtil;
import spbun.fileclean.common.SwingUtil;
import spbun.fileclean.ui.MainFrame;

/**
 * 
 * 系统的入口
 * 
 * @author spbun
 *
 */
public class FCApplication {

	/** 日志对象 */
	private static final Logger LOG = Logger.getLogger(FCApplication.class);

	/** 单例模式，避免重复构造多次 */
	private static FCApplication instance = null;

	/**
	 * 获取一个实例对象
	 * 
	 * @return
	 */
	public static FCApplication getInstance() {

		if (instance == null) {

			synchronized (FCApplication.class) {// 标准的单例模式

				if (instance == null) {
					instance = new FCApplication();
				}
			}
		}

		return instance;
	}

	/**
	 * 数据库连接池，我们暂时使用H2来试试效果，使用过MySQL，效果不佳。
	 */
	private DataSource ds;

	/**
	 * 系统的主界面
	 */
	private MainFrame mainFrame = null;

	/**
	 * 私有的构造方法，为了单例模式
	 */
	private FCApplication() {
		//
	}

	/**
	 * 获取一个数据库连接
	 * 
	 * @return 获取一个数据库连接
	 */
	public DataSource getDataSouce() {

		if (ds == null) {// 延迟加载，提高系统启动速度
			ds = initDataSource(new File(FileUtil.getWebAppBasePath(), "database"));
		}

		return ds;
	}

	private DataSource initDataSource(File database) {

		JdbcDataSource ds = new JdbcDataSource();
		ds.setURL("jdbc:h2:file:" + database);

		return ds;
	}

	private void initFrame() {

		SwingUtil.updateUIFont(SwingUtil.FONT_SIMSUN);

		this.mainFrame = new MainFrame();
		mainFrame.setVisible(true);
	}

	/**
	 * 启动系统
	 * 
	 * @param forder
	 * @param destFile
	 * @throws Exception
	 */
	public void startApp() throws Exception {

		LOG.info("系统执行路径：" + FileUtil.getWebAppBasePath());

		initFrame();

		//
		// FileTravel travel = new FileTravel(forder);
		//
		// long start = System.currentTimeMillis();
		//
		// new Thread(new WatchThread(travel)).start();
		//
		// travel.travel();
		// long end = System.currentTimeMillis();
		//
		// List<FileInfo> list = travel.list;
		//
		// try (FileOutputStream fos = new FileOutputStream(destFile);
		// ObjectOutputStream oos = new ObjectOutputStream(fos);) {
		// oos.writeObject(list);
		// }
		//
		// System.out.println(list.size());
		//
		// System.out.println("耗时：" + ((end - start) / 1000));

	}
}
